package io.aicn.lowcode.mapper.dbmanager;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import io.aicn.lowcode.entity.dbmanager.DataTable;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.util.List;

/**
 * 数据表信息Mapper接口
 * 
 * @author lowcode-generator
 * @since 2025-01-25
 */
@Mapper
public interface DataTableMapper extends BaseMapper<DataTable> {

    /**
     * 根据数据源ID查询表列表
     * 
     * @param datasourceId 数据源ID
     * @return 数据表列表
     */
    @Select("SELECT * FROM dbm_data_table WHERE datasource_id = #{datasourceId} ORDER BY table_name")
    List<DataTable> selectByDatasourceId(@Param("datasourceId") Long datasourceId);

    /**
     * 根据数据源ID和数据库名查询表列表
     * 
     * @param datasourceId 数据源ID
     * @param databaseName 数据库名
     * @return 数据表列表
     */
    @Select("SELECT * FROM dbm_data_table WHERE datasource_id = #{datasourceId} AND database_name = #{databaseName} ORDER BY table_name")
    List<DataTable> selectByDatasourceAndDatabase(@Param("datasourceId") Long datasourceId, @Param("databaseName") String databaseName);

    /**
     * 根据表名模糊查询
     * 
     * @param datasourceId 数据源ID
     * @param tableName 表名
     * @return 数据表列表
     */
    @Select("SELECT * FROM dbm_data_table WHERE datasource_id = #{datasourceId} AND table_name LIKE CONCAT('%', #{tableName}, '%') ORDER BY table_name")
    List<DataTable> selectByTableNameLike(@Param("datasourceId") Long datasourceId, @Param("tableName") String tableName);

    /**
     * 统计数据源下的表数量
     * 
     * @param datasourceId 数据源ID
     * @return 表数量
     */
    @Select("SELECT COUNT(*) FROM dbm_data_table WHERE datasource_id = #{datasourceId}")
    int countByDatasourceId(@Param("datasourceId") Long datasourceId);

    /**
     * 查询数据源下的数据库列表
     * 
     * @param datasourceId 数据源ID
     * @return 数据库名列表
     */
    @Select("SELECT DISTINCT database_name FROM dbm_data_table WHERE datasource_id = #{datasourceId} ORDER BY database_name")
    List<String> selectDatabasesByDatasourceId(@Param("datasourceId") Long datasourceId);
}